clear all
close all
clc

% Cargamo-las imaxes, a orixinal e a filtrada
[ im   cmap   ] = imread('lena.png');
[ im_f cmap_f ] = imread('lena_filtrada.png');

IM = double(im) ./ 255;
IM_f = double(im_f) ./ 255;

n = 100;
min_max = [0 1];

%Partons de entrada 3x3
extremos = [min_max ; min_max ; min_max ; min_max ; min_max ; min_max ; min_max ; min_max ; min_max];

PE = zeros(9,n);
saida = zeros(1,n);

for i=1:n,
    a = round(rand * 254);
    if a == 0 
        a = 1;
    end
    b = round(rand * 254);
    if b == 0
        b = 1;
    end
    PE(1,i) = IM(a  ,b);
    PE(2,i) = IM(a+1,b);
    PE(3,i) = IM(a+2,b);
    PE(4,i) = IM(a  ,b+1);
    PE(5,i) = IM(a+1,b+1);
    PE(6,i) = IM(a+2,b+1);
    PE(7,i) = IM(a  ,b+2);
    PE(8,i) = IM(a+1,b+2);
    PE(9,i) = IM(a+2,b+2);
    
    saida(i) = IM_f(a+1,b+1);
end

%% Adestramento da rede
lr = maxlinlr(PE);

net = newlin(extremos,1,0,lr);
net.trainParam.epochs = 5000;
net.trainParam.goal = 0.001;

net = train(net,PE,saida);

%% Aplicamo-la rede adestrada as imaxes

imaxe_lena = zeros(253,253);

for b=1:253,
    for a=1:253,
        PE(1,a) = IM(a  ,b);
        PE(2,a) = IM(a+1,b);
        PE(3,a) = IM(a+2,b);
        PE(4,a) = IM(a  ,b+1);
        PE(5,a) = IM(a+1,b+1);
        PE(6,a) = IM(a+2,b+1);
        PE(7,a) = IM(a  ,b+2);
        PE(8,a) = IM(a+1,b+2);
        PE(9,a) = IM(a+2,b+2);
    end
    Y = sim(net,PE);
    imaxe_lena(:,b) = round(Y * 255);
end
    
figure(2)
  subplot(1,3,1)
    title('Imaxe orixinal lena.png');
    image(im);
    colormap(cmap);
  subplot(1,3,2)
    title('Imaxe lena_filtrada.png');
    image(im_f);
    colormap(cmap_f);
  subplot(1,3,3)
    title('Imaxe despois de aplicado o filtro');
    image(imaxe_lena);
    colormap(cmap_f);
  

%% Aplicamo-lo filtro a unha nova imaxe
[ im   cmap   ] = imread('david.png');
IM = double(im) ./ 255;

imaxe_david = zeros(253,253);

for b=1:253,
    for a=1:253,
        PE(1,a) = IM(a  ,b);
        PE(2,a) = IM(a+1,b);
        PE(3,a) = IM(a+2,b);
        PE(4,a) = IM(a  ,b+1);
        PE(5,a) = IM(a+1,b+1);
        PE(6,a) = IM(a+2,b+1);
        PE(7,a) = IM(a  ,b+2);
        PE(8,a) = IM(a+1,b+2);
        PE(9,a) = IM(a+2,b+2);
    end
    Y = sim(net,PE);
    imaxe_david(:,b) = round(Y * 255);
end
    
figure(3)
  subplot(1,2,1)
    title('Imaxe orixinal david.png');
    image(im);
    colormap(cmap);
  subplot(1,2,2)
    title('Imaxe filtrada pola rede adestrada');
    image(imaxe_david);
    colormap(cmap_f);
